import { BaseTool } from '../types';
import { httpsRequest } from '../../utils/proxy';
import { Readability } from '@mozilla/readability';
import { JSDOM } from 'jsdom';

export interface PageContent {
  url: string;
  title: string;
  content: string;
  summary: string;
  wordCount: number;
  language?: string;
  author?: string;
  publishedTime?: string;
}

export class PageFetcher extends BaseTool {
  name = 'page_fetcher';
  description = `获取网页内容并提取关键信息，包括标题、正文、标题层级、链接等结构化数据

使用原则：
**应该获取网页内容的情况：**
1. 用户提供了具体的URL链接，要求获取内容
2. 需要分析、总结、提取特定网页的信息
3. 要求对比多个网页的内容
4. 需要获取网页中的具体数据、文章、产品信息等
5. 用户要求验证网页中的某些信息
6. 需要提取网页的结构化信息（标题、链接、图片等）

**不应该获取网页内容的情况：**
1. 用户没有提供具体的URL
2. 询问一般性问题，不涉及特定网页
3. 请求创建、编写内容（而非获取现有内容）
4. URL明显不安全或不可访问
5. 用户只是随意提到某个网站，但没有要求获取内容
6. 询问技术问题、概念解释等不需要网页内容的情况

决策伪代码：
if (用户提供了具体URL && (要求获取内容 || 分析网页 || 提取信息)) {
    return 应该获取网页内容;
} else if (用户明确要求"获取网页"/"抓取页面"/"分析网站") {
    if (提供了URL) {
        return 应该获取网页内容;
    } else {
        return 提示用户提供URL;
    }
} else if (没有URL || 一般性询问 || 创建任务 || 技术问题) {
    return 不应该获取网页内容;
} else {
    // 模糊情况，根据具体需求判断
    if (明确需要特定网页的实际内容) {
        return 应该获取网页内容;
    } else {
        return 不应该获取网页内容;
    }
}

调用示例：
用户："帮我获取这个网页的内容 https://example.com"
你应该回复：我来为您获取网页内容
<function_calls>
<invoke name="page_fetcher">
<parameter name="url">https://example.com</parameter>
</invoke>
</function_calls>

用户："获取网页内容，限制在3000字符内"
你应该回复：我来为您获取网页内容
<function_calls>
<invoke name="page_fetcher">
<parameter name="url">https://example.com</parameter>
<parameter name="options">{"maxContentLength": 3000}</parameter>
</invoke>
</function_calls>`;
  parameters = {
    type: 'object' as const,
    properties: {
      url: {
        type: 'string',
        description: '要获取内容的网页URL地址'
      },
      options: {
        type: 'object',
        description: '可选配置参数',
        properties: {
          maxContentLength: {
            type: 'number',
            description: '内容最大长度限制，默认5000字符'
          }
        }
      }
    },
    required: ['url']
  };

  async execute(params: { url: string; options?: { 
    maxContentLength?: number;
  } }): Promise<string> {
    try {
      const { url, options = {} } = params;
      const {
        maxContentLength = 5000
      } = options;

      console.log(`📄 正在获取页面内容: ${url}`);
      
      const pageContent = await this.fetchPageContent(url, {
        maxContentLength
      });

      return this.formatResponse(pageContent);
    } catch (error) {
      return `❌ 获取页面内容失败: ${error instanceof Error ? error.message : '未知错误'}`;
    }
  }

  private async fetchPageContent(url: string, options: {
    maxContentLength: number;
  }): Promise<PageContent> {
    // 获取HTML内容
    const response = await httpsRequest(url, {
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.5',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
      }
    });

    if (response.status !== 200) {
      throw new Error(`HTTP ${response.status}: ${response.statusText}`);
    }

    const html = response.data;
    
    // 使用JSDOM创建DOM对象
    const dom = new JSDOM(html, { url });
    const document = dom.window.document;
    
    // 使用Readability解析页面
    const reader = new Readability(document);
    const article = reader.parse();
    
    if (!article) {
      throw new Error('无法解析页面内容');
    }
    
    // 限制内容长度
    let content = article.textContent || '';
    if (content.length > options.maxContentLength) {
      content = content.substring(0, options.maxContentLength) + '...';
    }

    // 生成摘要（取前200字符）
    const summary = content.substring(0, 200).trim() + (content.length > 200 ? '...' : '');

    // 计算字数
    const wordCount = content.split(/\s+/).length;

    return {
      url,
      title: article.title || '无标题',
      content,
      summary,
      wordCount,
      language: article.lang || undefined,
      author: article.byline || undefined,
      publishedTime: article.publishedTime || undefined
    };
  }

  private formatResponse(pageContent: PageContent): string {
    let response = `📄 页面内容提取结果\n\n`;
    response += `🌐 URL: ${pageContent.url}\n`;
    response += `📝 标题: ${pageContent.title}\n`;
    response += `📊 字数: ${pageContent.wordCount} 词\n`;
    
    if (pageContent.language) {
      response += `🌍 语言: ${pageContent.language}\n`;
    }
    
    if (pageContent.author) {
      response += `👤 作者: ${pageContent.author}\n`;
    }
    
    if (pageContent.publishedTime) {
      response += `📅 发布时间: ${pageContent.publishedTime}\n`;
    }
    
    response += `\n📋 内容摘要:\n${pageContent.summary}\n\n`;
    response += `📄 主要内容:\n${pageContent.content}\n`;

    return response;
  }
}